#ifndef __IAP_H
#define __IAP_H

#define CMD_SUCCESS 0
#define IAP_ADDRESS 0x1FFF1FF1

#define USER_FLASH_START 		0x00010000 	//64К
#define SECTOR_SIZE					32768
#define USER_SECTOR_START		16	


#define APP_INFO_ADDRESS		0x00078000	//Последние 32K - размер приложения и CRC32
#define APP_INFO_SECTOR			29
#define MAC_ADDRESS				0x0000E000	//MAC адрес - прошивается
#define NETPARAMS_ADDRESS		0x0000F000	//Сетевые параметры - при переходе в загрузчик из приложения
#define NETPARAMS_SECTOR		15	

typedef enum
{
PREPARE_SECTOR_FOR_WRITE	=50,
COPY_RAM_TO_FLASH			=51,
ERASE_SECTOR				=52,
BLANK_CHECK_SECTOR			=53,
READ_PART_ID				=54,
READ_BOOT_VER				=55,
COMPARE						=56,
REINVOKE_ISP				=57
}IAP_Command_Code;


#define SystemFrequency SystemCoreClock

typedef struct 
{
	U32 length;
	U32 crc32;
} AppInfoT;
	

/*
	Прототипы функций
*/
void execute_user_code(void);
void _iap_entry(uint32_t param_tab[],uint32_t result_tab[]);
void enable_interrupts(uint32_t interrupts);
void disable_interrupts(uint32_t interrupts);
U32 crc32(U8 * buffer, U32 length);
int check_app(void);
void erase_sector(uint32_t start_sector,uint32_t end_sector);
void prepare_sector(uint32_t start_sector,uint32_t end_sector);
void write_data(U32 flash_address,U32 * flash_data_buf, U32 count);

#endif
